#ifndef A03949F7_40F4_4E82_A0E0_96CDCDEBD5B3
#define A03949F7_40F4_4E82_A0E0_96CDCDEBD5B3

#include <string>
#include "pub.h"

namespace cores
{
    namespace topics
    {
        class Publisher;

        /**
        * @brief 模板接口类，处理各类数据的接口类
        *
        * @tparam T
        */
        template <typename T>
        class ISubscribeImpl
        {
        public:
            virtual void onDataReceived(Publisher* sender, const std::string& topic, const T& value) = 0;
        };

        /**
        * @brief 订阅者
        *
        */
        class Subscriber
        {
        private:
            /**
             * @brief 订阅者名称
             *
             */
            std::string _name;

        protected:
            /**
             * @brief 构造函数
             *
             * @param name 订阅者名称
             */
            Subscriber(const std::string& name);

        public:
            /**
             * @brief 析构函数
             *
             */
            virtual ~Subscriber();

            /**
             * @brief 订阅主题
             *
             * @param topic 主题名称
             */
            void subscribe(const std::string& topic);

            /**
             * @brief 退订主题
             *
             * @param topic 主题名称
             */
            void unsubscribe(const std::string& topic);

            /**
             * @brief 获取订阅者名称
             *
             * @return const std::string& 返回订阅者名称
             */
            const std::string& name() const;

            /**
             * @brief 获取订阅数据处理接口对象
             *
             * @tparam T
             * @return ISubscribeImpl<T>*
             */
            template <typename T>
            ISubscribeImpl<T>* getSubscribeImpl()
            {
                return dynamic_cast<ISubscribeImpl<T>*>(this);
            }
        };
    }
}

#endif /* A03949F7_40F4_4E82_A0E0_96CDCDEBD5B3 */
